/**
 * 观察者观察到数据变化就进行模版的重新编译，给data上的每个属性添加观察者,观察者应该放在那个地方？（把数据放到html中的地方）因为数据变化就要把新的数据同步到html中
 * 当观察到新老值不一样时就进行跟新
 * 获取老值需要data和表达式expr,数据变化调用回调函数进行数据和视图的跟新(data上的属性调用set方法说明数据发生了变化此时进行跟新)
 */
class Wather{
    constructor(vm,expr,cb){
        this.vm=vm
        this.expr=expr
        this.cb=cb
        this.value=this.get() // watcher一被调用的时候就会去data上获取值
    }
    getVal(vm,expr){
        let exprs=expr.split('.')
        return exprs.reduce((prve,next)=>{
            return prve[next]
        },vm.$data)
    }
    get(){
       Dep.target=this
       let value = this.getVal(this.vm,this.expr)
       Dep.target=null       
       return value
    }
    update() {
     let newVal = this.getVal(this.vm,this.expr)
     let oldVal = this.value
     if(newVal !== oldVal){
        this.cb(newVal)
     }
    }
}